#ifndef __V_QUEUE_H__
#define __V_QUEUE_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "../common/v_lib_type.h"

typedef struct v_node  v_queue_node_t;
typedef struct v_node* v_queue_node_ptr_t;
struct v_queue {
    uint32_t size;
    v_queue_node_t *front, *rear;
};
typedef struct v_queue  v_queue_t;
typedef struct v_queue* v_queue_ptr_t;

/**
 * @brief 创建一个队列容器
 *
 * @param type_size : 容器中元素类型的size
 *
 * @return 返回容器的地址
 */
v_queue_ptr_t v_queue_create(uint32_t type_size);

/**
 * @brief 删除一个队列容器
 *
 * @param stack : 容器的地址
 *
 * @return NULL
 */
void v_queue_destroy(v_queue_ptr_t queue);

/**
 * @brief 向队尾推送一个元素
 *
 * @param queue : 容器地址
 * @param data_ptr : 推送元素地址
 * @param data_size : 推送元素的数据
 * @param copy_data : 自定义copy函数, 默认memcpy
 *
 * @return NULL
 */
vlib_status_t v_queue_push(v_queue_ptr_t queue, v_data_ptr_t data_ptr, uint32_t data_size, copy_data_f copy_data);

/**
 * @brief 队头元素出队
 *
 * @param queue : 容器的地址
 *
 * @return 1 : OK , 
 *         0 : ERROR , 
 *         -2 : OVERFLOW
 */
vlib_status_t v_queue_pop(v_queue_ptr_t queue);

/**
 * @brief 清空容器
 *
 * @param queue : 容器地址
 *
 * @return NULL
 * 注意: 指针类型的容器慎用, 只将指针变量释放, 可能会造成内存泄露
 */
void v_queue_clear(v_queue_ptr_t queue);

/**
 * @brief 判断栈容器是否为空
 *
 * @param queue : 容器地址
 *
 * @return true : 容器为空
 *         flase : 容器不为空
 */
bool v_queue_empty(v_queue_ptr_t queue);

/**
 * @brief 获取容器元素个数
 *
 * @param queue : 容器地址
 *
 * @return 元素个数
 */
uint32_t v_queue_size(v_queue_ptr_t queue);

/**
 * @brief 获取容器队头元素数据
 *
 * @param queue : 容器地址
 *
 * @return 栈顶元素数据地址
 */
v_data_ptr_t v_queue_front(v_queue_ptr_t queue);

/**
 * @brief 获取容器队尾元素数据
 *
 * @param queue : 容器地址
 *
 * @return 栈顶元素数据地址
 */
v_data_ptr_t v_queue_rear(v_queue_ptr_t queue);

#ifdef __cplusplus
} /*extern "C"*/
#endif

#endif  /* __V_QUEUE_H__ */
